<?
    class Zip 
		{
    	var $nHandle = 0;
    	var $nHandleEntry = 0;
    	var $aFields= array();
    	
    	// Si viene el archivo => lo abre
    	function Zip( $cArchivo = "" ) 
			{
            if ( $cArchivo ) {
                return $this->open($cArchivo);
            }
			}	
        
        function getCodingType () {
    	   return zlib_get_coding_type ();
        }
       
        // Descomprime todo el Contenido
        function unZipAll( $cDirectorio ) {
            if ( $this->nHandle == 0 ) {
                return false;
            }
            
            while ( $this->moveNext() ){
                $this->unZipFile( $cDirectorio, $this->aFields['name'] );
            }
                                                   
        }
        
        // Abre un archivo
    	function open ( $cArchivo ) {
    	   if ( $this->nHandle != 0 ) {
    	       zip_close($this->nHandle);
           }
           
           $this->nHandle = zip_open($cArchivo);           
        }
        
        // Mueve al Proximo archivo
        function moveNext() {
            // Si no esta abierto => no continua
            if ( $this->nHandle == 0 ) {
                return false;
            }
            
            $this->nHandleEntry = zip_read($this->nHandle);
            
            // Si no hay mas Archivos
            if ( $this->nHandleEntry == FALSE ) {
                return false;
            }

            $this->aFields['name'] = zip_entry_name( $this->nHandleEntry );
            $this->aFields['realSize'] = zip_entry_filesize( $this->nHandleEntry );
            $this->aFields['method'] = zip_entry_compressionmethod ( $this->nHandleEntry );
            $this->aFields['size'] = zip_entry_compressedsize ( $this->nHandleEntry );     
            return true;           
        }
        
        // Descomprime el Archivo Actual         
        function unZipFile( $cDirectorio, $cArchivo ) {
            // Si no esta abierto && No esta posisinado en un Archivo => no continua
            if ( $this->nHandle == 0 || $this->nHandleEntry == 0 ) {
                return false;
            }
            
            // Si no puede abrir el archivo 
            if (zip_entry_open($this->nHandle, $this->nHandleEntry , "r") == false ) {
                return false;
            }
            
            // Abre el archivo de Salida
            $nFd = fopen( $cDirectorio . "/" . $cArchivo , "wb");
            if ( $nFd == 0 ) {
                addMessage( "No se pudo abrir el archivo $cDirectorio/$cArchivo." );           	
            } else {
                // Lee de a bloques y graba en la salida
                while ( $cContenido = zip_entry_read($this->nHandleEntry ) ) {
                    fwrite($nFd, $cContenido );
                }
                
                // Cierra el Archivo de Salida
                fclose($nFd);            
            }
            
            // Ciera la Referencia del Archivo Comprimido
            zip_entry_close($this->nHandleEntry);

            return true;
        }
        
        function eof() {
            return $this->nHandleEntry == FALSE ? true: false;
        }

    	function close () {
    	   if ( $this->nHandle != 0 ) {
    	       zip_close($this->nHandle);
           }    	
    	}

    }
?>
